/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DAO;

import TAD.Cliente;
import TAD.Jornal;
import bancodedados.ConFactory;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author bocato
 */
public class ClienteDAO implements Dao{

    private final String URL = "jdbc:mysql://localhost/sist_jornal",
         NOME = "root", SENHA = "admin";
    private Connection conexao;
    private Statement comando;

    public void insere(Object dado) {
        Cliente sendoInserido = (Cliente) dado;
        conectarAoBanco();
        try{

            List<Jornal> listaJornais = sendoInserido.getJornais();
            String jornais = listaJornais.get(0).getNome();
            for(int i =  1; i < listaJornais.size(); i++){
                jornais+=", "+listaJornais.get(i).getNome();
            }
            // simplifiquei - no caso de um sistema maior deveria ser diferente
            String diasDeEntregaJornal_1 ="";
            if(sendoInserido.getJornais().get(0).getDiasDeEntrega()[0]){
                diasDeEntregaJornal_1+="Dom, ";
            }
            if(sendoInserido.getJornais().get(0).getDiasDeEntrega()[1]){
                diasDeEntregaJornal_1+="Seg, ";
            }
            if(sendoInserido.getJornais().get(0).getDiasDeEntrega()[2]){
                diasDeEntregaJornal_1+="Ter, ";
            }
            if(sendoInserido.getJornais().get(0).getDiasDeEntrega()[3]){
                diasDeEntregaJornal_1+="Qua, ";
            }
            if(sendoInserido.getJornais().get(0).getDiasDeEntrega()[4]){
                diasDeEntregaJornal_1+="Qui, ";
            }
            if(sendoInserido.getJornais().get(0).getDiasDeEntrega()[5]){
                diasDeEntregaJornal_1+="Sex, ";
            }
            if(sendoInserido.getJornais().get(0).getDiasDeEntrega()[6]){
                diasDeEntregaJornal_1+="Sab";
            }
            // ----------
            String diasDeEntregaJornal_2 ="";
            if(sendoInserido.getJornais().get(1).getDiasDeEntrega()[0]){
                diasDeEntregaJornal_1+="Dom, ";
            }
            if(sendoInserido.getJornais().get(1).getDiasDeEntrega()[1]){
                diasDeEntregaJornal_1+="Seg, ";
            }
            if(sendoInserido.getJornais().get(1).getDiasDeEntrega()[2]){
                diasDeEntregaJornal_1+="Ter, ";
            }
            if(sendoInserido.getJornais().get(1).getDiasDeEntrega()[3]){
                diasDeEntregaJornal_1+="Qua, ";
            }
            if(sendoInserido.getJornais().get(1).getDiasDeEntrega()[4]){
                diasDeEntregaJornal_1+="Qui, ";
            }
            if(sendoInserido.getJornais().get(1).getDiasDeEntrega()[5]){
                diasDeEntregaJornal_1+="Sex, ";
            }
            if(sendoInserido.getJornais().get(1).getDiasDeEntrega()[6]){
                diasDeEntregaJornal_1+="Sab";
            }
            // ----------
            String comandoSQL = "INSERT INTO Clientes VALUES('"+
                   sendoInserido.getNome()+ "', '" +
                   sendoInserido.getEndereco().getNomeDaRua()+ "', '" +
                   sendoInserido.getEndereco().getNumero()+ "', '" +
                   sendoInserido.getEndereco().getBairro()+ "', '" +
                   sendoInserido.getEndereco().getComplemento()+ "', '" +
                   jornais+ "', '"+
                   diasDeEntregaJornal_1+ "', '" +
                   diasDeEntregaJornal_2+ "', '" +
                   sendoInserido.getAssinatura().getDiaDePagamento()+ "', '"+
                   sendoInserido.getAssinatura().getMensalidade();
            comando.executeUpdate(comandoSQL);
        }
        catch(SQLException e){
            imprimeErro("Erro ao inserir Pessoa", e.getMessage());
        }
        finally {
            fecharConexaoDoBanco();
        }
    }

    public void atualiza(Object dado) {
        Cliente sendoInserido = (Cliente) busca(dado);
        conectarAoBanco();
        try{
            List<Jornal> listaJornais = sendoInserido.getJornais();
            String jornais = listaJornais.get(0).getNome();
            for(int i =  1; i < listaJornais.size(); i++){
                jornais+=", "+listaJornais.get(i).getNome();
            }
            // simplifiquei - no caso de um sistema maior deveria ser diferente
            String diasDeEntregaJornal_1 ="";
            if(sendoInserido.getJornais().get(0).getDiasDeEntrega()[0]){
                diasDeEntregaJornal_1+="Dom, ";
            }
            if(sendoInserido.getJornais().get(0).getDiasDeEntrega()[1]){
                diasDeEntregaJornal_1+="Seg, ";
            }
            if(sendoInserido.getJornais().get(0).getDiasDeEntrega()[2]){
                diasDeEntregaJornal_1+="Ter, ";
            }
            if(sendoInserido.getJornais().get(0).getDiasDeEntrega()[3]){
                diasDeEntregaJornal_1+="Qua, ";
            }
            if(sendoInserido.getJornais().get(0).getDiasDeEntrega()[4]){
                diasDeEntregaJornal_1+="Qui, ";
            }
            if(sendoInserido.getJornais().get(0).getDiasDeEntrega()[5]){
                diasDeEntregaJornal_1+="Sex, ";
            }
            if(sendoInserido.getJornais().get(0).getDiasDeEntrega()[6]){
                diasDeEntregaJornal_1+="Sab";
            }
            // ----------
            String diasDeEntregaJornal_2 ="";
            if(sendoInserido.getJornais().get(1).getDiasDeEntrega()[0]){
                diasDeEntregaJornal_1+="Dom, ";
            }
            if(sendoInserido.getJornais().get(1).getDiasDeEntrega()[1]){
                diasDeEntregaJornal_1+="Seg, ";
            }
            if(sendoInserido.getJornais().get(1).getDiasDeEntrega()[2]){
                diasDeEntregaJornal_1+="Ter, ";
            }
            if(sendoInserido.getJornais().get(1).getDiasDeEntrega()[3]){
                diasDeEntregaJornal_1+="Qua, ";
            }
            if(sendoInserido.getJornais().get(1).getDiasDeEntrega()[4]){
                diasDeEntregaJornal_1+="Qui, ";
            }
            if(sendoInserido.getJornais().get(1).getDiasDeEntrega()[5]){
                diasDeEntregaJornal_1+="Sex, ";
            }
            if(sendoInserido.getJornais().get(1).getDiasDeEntrega()[6]){
                diasDeEntregaJornal_1+="Sab";
            }
            // ----------
            String comandoSQL = "UPDATE Clientes VALUES('"+
                   sendoInserido.getNome()+ "', '" +
                   sendoInserido.getEndereco().getNomeDaRua()+ "', '" +
                   sendoInserido.getEndereco().getNumero()+ "', '" +
                   sendoInserido.getEndereco().getBairro()+ "', '" +
                   sendoInserido.getEndereco().getComplemento()+ "', '" +
                   jornais+ "', '"+
                   diasDeEntregaJornal_1+ "', '" +
                   diasDeEntregaJornal_2+ "', '" +
                   sendoInserido.getAssinatura().getDiaDePagamento()+ "', '"+
                   sendoInserido.getAssinatura().getMensalidade()+" WHERE Nome = '" + (String)dado + "';";
            System.out.println("Atualizada!");
            comando.executeUpdate(comandoSQL);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            fecharConexaoDoBanco();
        }
    }

    public void apaga(Object dado) {
        conectarAoBanco();
        try {
            comando.executeUpdate("DELETE FROM pessoa WHERE Nome = '" + (String)dado + "';");
        } catch (SQLException e) {
            imprimeErro("Erro ao apagar pessoas", e.getMessage());
        } finally {
            fecharConexaoDoBanco();
        }
    }

    public Object busca(Object dado) {
        conectarAoBanco();
        ResultSet rs;
        Cliente temp = null;
        try {
            rs = comando.executeQuery("SELECT * FROM pessoa");
        while (rs.next()) {
            temp = new Cliente();
            // pega todos os atributos da pessoa
            temp.setNome(rs.getString("Nome"));
            temp.getEndereco().setNomeDaRua(rs.getString("NomeDaRua"));
            temp.getEndereco().setNumero(rs.getInt("NumeroCasa"));
            temp.getEndereco().setBairro(rs.getString("Bairro"));
            temp.getEndereco().setComplemento(rs.getString("Complemento"));
            // tratando assinaturas
            String assinaturas = rs.getString("Assinaturas");
            String[] split = assinaturas.split(", ");
            for(int i = 0; i < 2; i++){
                Jornal j = new Jornal();
                j.setNome(split[i]);
                temp.getJornais().add(j);
            }
            // tratando dias de entrega
            String diasEnt = rs.getString("DiasRecebimentoJornal_1");
            String[] split_2 = diasEnt.split(", ");
            boolean[] diasDeEntrega = new boolean[7];
               if(split[0].equals("Dom")){
                  diasDeEntrega[0] = true;
               }
               if(split[1].equals("Seg")){
                   diasDeEntrega[1] = true;
               }
               if(split[2].equals("Ter")){
                   diasDeEntrega[2] = true;
               }
               if(split[3].equals("Qua")){
                   diasDeEntrega[3] = true;
               }
               if(split[4].equals("Qui")){
                   diasDeEntrega[4] = true;
               }
               if(split[5].equals("Sex")){
                   diasDeEntrega[5] = true;
               }
               if(split[6].equals("Sab")){
                   diasDeEntrega[6] = true;
               }
            }     
            return temp;
        } catch (SQLException e) {
            imprimeErro("Erro ao buscar pessoas", e.getMessage());
            return null;
        }
    }

    public void conectarAoBanco() {
        try {
             conexao = ConFactory.conexao(URL, NOME, SENHA, ConFactory.MYSQL);
             comando = (Statement) conexao.createStatement();
             System.out.println("Conectado!");
         } catch (ClassNotFoundException e) {
            imprimeErro("Erro ao carregar o driver", e.getMessage());
         } catch (SQLException e) {
            imprimeErro("Erro ao conectar", e.getMessage());
         }
    }

    public void fecharConexaoDoBanco() {
        try {
             comando.close();
             conexao.close();
             System.out.println("Conexão Fechada");
         } catch (SQLException e) {
            imprimeErro("Erro ao fechar conexão", e.getMessage());
         }
    }

    public void imprimeErro(String msg, String msgErro) {
      JOptionPane.showMessageDialog(null, msg, "Erro crítico", 0);
      System.err.println(msg);
      System.out.println(msgErro);
      System.exit(0);
   }

}
